﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using clEntidad;
using System.Data.OleDb;
using clBD;
using clEntidad.Ex;

namespace clBUS
{
    public class BUSUsuario:BUSBase
    {
        public BUSUsuario(String cadBD) : base(cadBD) { }
        public Usuario validaLogin(String login, String password, int idLocal)
        {
            return validaLogin(login, password, false, "",idLocal);
        }
        public void cambiaClave(string login,string clave, string claveNueva, int idLocal)
        {
            using (OleDbConnection cn = getCn())
            {
                BDUsuario objBD = new BDUsuario(cn);
                Usuario user = objBD.getByLogin(login);
                validar(login, clave,cn,idLocal);
                cambiaClave(user.id, clave, claveNueva, cn, false);
            }
        }
        public Usuario validaLogin(String login, String password,bool claveCaduco, String claveNueva, int idLocal)
        {
            Usuario elem=null;
            using (OleDbConnection cn = getCn())
            {
                BDUsuario objBD = new BDUsuario(cn);
                Usuario usr = objBD.getByLogin(login);
                try
                {
                    elem = validar(login,password,cn,idLocal);
                    elem.idLogin= objBD.registrarIng(login, true, "");
                    return elem;
                }catch(ClaveCaducoException ex)
                {
                    if (claveCaduco)
                    {
                        cambiaClave(usr.id, password, claveNueva, cn, false);
                        elem = validar(login, claveNueva, cn, idLocal);
                        elem.idLogin = objBD.registrarIng(login, true, "");
                        return elem;
                    }
                    else
                    {
                        objBD.registrarIng(login, false, ex.Message);
                        throw ex;
                    }
                }
                catch (LoginException ex)
                {
                    objBD.registrarIng(login, false, ex.Message);
                    throw ex;
                }
            }

        }
        private void cambiaClave(int id,string clave,string claveNueva,OleDbConnection cn, bool caduca)
        {
            Seguridad seguridad = new Seguridad();
            if (clave == claveNueva)
                throw new BUSException("La clave nueva debe ser distinta a la clave actual");
            new BDUsuario(cn).cambiaClave(id, seguridad.getMD5(claveNueva), false);


        }
        public void editarClave(int id, string claveNueva, int idUsrAud, bool caduca)
        {
            Seguridad seguridad = new Seguridad();
            using (OleDbConnection cn = getCn())
            {
                new BDUsuario(cn).cambiaClave(id,seguridad.getMD5(claveNueva),caduca);
            }
        }
        private Usuario validar(String login, String password, OleDbConnection cn, int idLocal)
        {
            String mensaje1 = "Usuario y/o clave son incorrectos";
            String mensaje2 = "El usuario ingresado está inactivo";
            String mensaje3 = "Debe ingresar usuario y clave";
            String mensaje4 = "Local no corresponde a usuario";
            if(login=="" || password=="")
                throw new LoginException(mensaje3);
            String paswEnc = new Seguridad().getMD5(password);
            Usuario elem=null;

            BDUsuario objBD = new BDUsuario(cn);
            elem = objBD.getByLogin(login);
            if (elem == null)
                throw new LoginException(mensaje1);
            elem.Locales = objBD.getLocales(elem.id);
            if (!elem.activo)
                throw new LoginException(mensaje2);
            if(elem.paswEncryp!=paswEnc)
                throw new LoginException(mensaje1);

            if(!validaLocal(elem,idLocal))
                throw new LoginException(mensaje4);
            if (elem.esCaduco)
            {
                throw new ClaveCaducoException();
            }
            return elem;
        }
        private bool validaLocal(Usuario usuario,int idLocal)
        {
            if (!usuario.esAdmin)
            {
                bool sucValida = false;
                foreach (Local local in usuario.Locales)
                {
                    if (local.id == idLocal)
                    {
                        return true;
                    }
                }
                return sucValida;
            }
            else
            {
                return true;
            }
        }

        public List<Usuario> getAll()
        {
            using (OleDbConnection cn = getCn())
            {
                return new BDUsuario(cn).getAll();
            }
        }
        public Usuario add(Usuario elem, int idUsrAud)
        {
            using (OleDbConnection cn = getCn())
            {
                try
                {
                    BDUsuario objBD =new BDUsuario(cn); 
                    elem.paswEncryp = new Seguridad().getMD5(elem.pasw);
                    Usuario rpta = objBD.add(elem, idUsrAud);
                    foreach (Local loc in elem.Locales)
                    {
                        objBD.addLocal(elem.id, loc.id);
                    }
                    return rpta;
                }
                catch (OleDbException ex)
                {
                    if (ex.ErrorCode == -2147467259)
                        throw new BUSException("Ya existe otro usuario con los mismos datos, por favor validar");
                    else
                        throw ex;
                }
            }
        }
        public Usuario get(int id)
        {
            using (OleDbConnection cn = getCn())
            {
                BDUsuario objBD = new BDUsuario(cn);
                Usuario elem = objBD.get(id);
                elem.Locales = objBD.getLocales(id);
                return elem;
            }
        }
        public Usuario getByLogin(String login)
        {
            using (OleDbConnection cn = getCn())
            {
                return new BDUsuario(cn).getByLogin(login);
            }
        }
        public void activar(int id, bool activo,int idUsrAud)
        {
            using (OleDbConnection cn = getCn())
            {
                new BDUsuario(cn).activar(id, activo, idUsrAud);
            }

        }
        public void update(Usuario elem, int idUsrAud)
        {
            using (OleDbConnection cn = getCn())
            {
                try
                {
                    BDUsuario objBD = new BDUsuario(cn);
                    objBD.update(elem, idUsrAud);
                    objBD.delLocales(elem.id);
                    foreach (Local loc in elem.Locales)
                    {
                        objBD.addLocal(elem.id, loc.id);
                    }                    
                }
                catch (OleDbException ex)
                {
                    if (ex.ErrorCode == -2147467259)
                        throw new BUSException("Ya existe otro usuario con los mismos datos, por favor validar");
                    else
                        throw ex;
                }

            }
        }
        public List<RegistroAcceso> getAccesos(int id)
        {
            using (OleDbConnection cn = getCn())
            {
                BDUsuario objBD = new BDUsuario(cn);
                return objBD.getAccesos(id);
            }
        }
    }
}
